home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / util / cli / MakeLnk_TV.lha / MakeLink.TV / MakeLink.c < prev    next >
C/C++ Source or Header  |  1994-12-04  |  2KB  |  76 lines

  1. #include <proto/exec.h>
  2. #include <proto/dos.h>
  3.  
  4. struct DosLibrary *DOSBase;
  5. const char verstag[] = "\0$VER: makelink.TV 42.2 (18.11.94)\n";
  6.  
  7. /* all on stack, so we can be resident */
  8. /* TODO: Link loop detection like C='s makelink */
  9.  
  10. int MAIN(void) {
  11.   int rc = 20;
  12.   struct RDArgs *rda;
  13.   struct {
  14.     char *from;
  15.     char *to;
  16.     long hard;
  17.     long force;
  18.     long soft;
  19.   } args = { NULL, NULL, 0, 0, 0 };
  20.   BPTR lock;
  21.   struct FileInfoBlock *fib;
  22.  
  23.   if (!(DOSBase = (void *)OpenLibrary("dos.library",37)))
  24.     return 50;
  25.   if (!(rda = ReadArgs("FROM/A,TO/A,HARD/S,FORCE/S,SOFT/S",(LONG *)&args,
  26.                NULL))) {
  27.     PrintFault(IoErr(),NULL);
  28.     goto quit0;
  29.   }
  30.   if (!(fib = AllocDosObject(DOS_FIB,NULL))) {
  31.     PrintFault(ERROR_NO_FREE_STORE,NULL);
  32.     goto quit1;
  33.   }
  34.   if (args.soft) {
  35.     if (args.hard) {
  36.       PutStr("Make up your mind, is it HARD or SOFT?\n");
  37.       goto quit2;
  38.     }
  39.     if (!MakeLink(args.from,(LONG)args.to,LINK_SOFT)) {
  40.       PrintFault(IoErr(),args.from);
  41.       goto quit2;
  42.     }
  43.     rc = 0;
  44.     goto quit2;
  45.   } else {
  46.     if (!(lock = Lock(args.to,SHARED_LOCK))) {
  47.       PrintFault(IoErr(),args.to);
  48.       goto quit2;
  49.     }
  50.     if (!Examine(lock,fib)) {
  51.       PrintFault(IoErr(),args.to);
  52.       goto quit3;
  53.     }
  54.     if (fib->fib_EntryType > 0) { /* link loop detection goes in here */
  55.       if (!args.force) {
  56.     PutStr("Links to directories require use of the FORCE keyword\n");
  57.     goto quit3;
  58.       }
  59.     }
  60.     if (!MakeLink(args.from,lock,LINK_HARD)) {
  61.       PrintFault(IoErr(),args.from);
  62.       goto quit3;
  63.     }
  64.     rc = 0;
  65.   }
  66.  quit3:
  67.   UnLock(lock);
  68.  quit2:
  69.   FreeDosObject(DOS_FIB,fib);
  70.  quit1:
  71.   FreeArgs(rda);
  72.  quit0:
  73.   CloseLibrary((void *)DOSBase);
  74.   return rc;
  75. }
  76.